home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1994 November: Tool Chest / Dev.CD Nov 94.toast / Tool Chest / Development Tools & Languages / • Other Platforms / PCCTS / testcpp / 3 / MyLexer.C < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-14  |  1.8 KB  |  75 lines  |  [TEXT/MPS ]

  1. /* MyTokenBuffer.c */
  2. /* Sample replacement for DLGLexer */
  3. /* Shows how to override DLG with your own lexer */
  4.  
  5. #include <stdio.h>
  6. #include <ctype.h>
  7. #include <stdlib.h>
  8. #include <iostream.h>
  9.  
  10. #include "config.h"                    /* include token defs */
  11. #include "mytokens.h"                /* include token defs */
  12. #include APARSER_H                    /* include all the ANTLR yuck */
  13. #include "MyLexer.h"                /* define your lexer */
  14. typedef ANTLRCommonToken ANTLRToken;/* use a predefined Token class */
  15.  
  16. void panic(char *s) {
  17.    cerr << s << '\n';
  18.    exit(5);
  19. }
  20.  
  21. MyLexer::MyLexer()
  22. {
  23.     c = getchar();
  24. }
  25.  
  26. /* Recognizes Tokens IDENTIFIER and NUMBER */
  27. ANTLRAbstractToken *MyLexer::
  28. getToken()
  29. {
  30.     /* we will return a pointer to this next guy */
  31.     ANTLRToken *resultToken = new ANTLRToken;
  32.  
  33.     ANTLRChar TokenBuffer[100];
  34.                         /* This routine will just crash if tokens become
  35.                            more than 99 chars; your code must of course
  36.                            gracefully recover/adapt */
  37.    int  index=0;
  38.  
  39.    while ( c==' ' || c=='\n' ) c=getchar();
  40.  
  41.    if (c==EOF) {resultToken->setType(Eof); return resultToken;}
  42.  
  43.    if (isdigit(c)) {
  44.       /* Looks like we have ourselves a number token */
  45.       while (isdigit(c)) {
  46.          TokenBuffer[index++]=c;
  47.          c = getchar();
  48.       }
  49.       TokenBuffer[index]='\0';
  50.       
  51.       resultToken->setType(NUMBER);
  52.       resultToken->setText(TokenBuffer); /* not exactly swift, unfortunately... */
  53.  
  54.       return resultToken;
  55.    }
  56.    
  57.    if (isalpha(c)) {
  58.       /* We have ourselves an IDENTIFIER token */
  59.       while (isalpha(c)) {
  60.          TokenBuffer[index++]=c;
  61.          c = getchar();
  62.       }
  63.       TokenBuffer[index]='\0';
  64.  
  65.       resultToken->setType(IDENTIFIER);
  66.       resultToken->setText(TokenBuffer); /* not exactly swift, unfortunately... */
  67.  
  68.       return resultToken;
  69.    }
  70.  
  71.    else
  72.       panic("lexer error");
  73. }
  74.  
  75.